home *** CD-ROM | disk | FTP | other *** search
/ Amiga News 95 / Amiga News 95.iso / dpat / dpat01 / megaboot / mega_boot.lst < prev    next >
File List  |  1992-02-29  |  8KB  |  413 lines

  1. $m4096
  2. '
  3. RESERVE 70*1024
  4. np$="RAM:"
  5. n$=""
  6. '
  7. ~SetTaskPri(FindTask(0),-1)
  8. SETWPEN 1,4
  9. OPENS 1,0,0,640,256,3,&H8000
  10. TITLES #1," "
  11. OPENW #1,0,0,640,256,&H0,256+4096
  12. CLEARW #1
  13. DIM c%(8),col$(2),bp%(2),a$(50),screen$(3)
  14. @picture
  15. @get_screen
  16. '
  17. n&=0
  18. REPEAT
  19.   READ a$(n&)
  20.   INC n&
  21. UNTIL a$(PRED(n&))="*"
  22. '
  23. DATA      FICHIERS     , LOAD, SAVE , SAVE AS ...    , QUITTER          ,
  24. DATA      BOOT OPTIONS      , LOAD BOOT , SAVE BOOT , DUMP BOOT , MAKE CHECKSUM , UNDO CHECKSUM         ,
  25. DATA      DRIVES     ,   DF0:     ,   DF1:,   DF2:,   DF3:         ,,,*
  26. MENU a$()
  27. '
  28. MENU KEY 1,ASC("L")
  29. MENU KEY 2,ASC("S")
  30. MENU KEY 3,ASC("A")
  31. MENU KEY 4,ASC("Q")
  32. MENU KEY 5,ASC("$")
  33. MENU KEY 7,ASC("R")
  34. MENU KEY 8,ASC("W")
  35. MENU KEY 9,ASC("D")
  36. MENU KEY 10,ASC("M")
  37. MENU KEY 11,ASC("U")
  38. MENU KEY 14,ASC("0")
  39. MENU KEY 15,ASC("1")
  40. MENU KEY 16,ASC("2")
  41. MENU KEY 17,ASC("3")
  42. '
  43. ON MENU GOSUB choix
  44. unit&=0
  45. MENU 14,256+64+16+2
  46. '
  47. @initasm
  48. buffer%=AllocMem(1024,&H10002)
  49. '
  50. IF buffer%>0
  51.   exitflag!=0
  52.   REPEAT
  53.     SLEEP
  54.     @memory
  55.   UNTIL exitflag!
  56.   VOID FreeMem(buffer%,1024)
  57. ELSE
  58.   @scrolling_texte("SORRY ! VOUS N'AVEZ PLUS DE CHIP-RAM (J'ME CASSE ...) ",31,31,31,-250)
  59. ENDIF
  60. ~SetTaskPri(FindTask(0),0)
  61. CLOSEW #0
  62. CLOSES 1
  63. CLEAR
  64. EDIT
  65. '
  66. PROCEDURE memory
  67.   COLOR 6
  68.   TEXT 163,226,STR$(AvailMem(&H4))+" OCTETS "
  69.   TEXT 163,209,STR$(AvailMem(&H2))+" OCTETS "
  70. RETURN
  71. '
  72. PROCEDURE choix
  73.   c$=UPPER$(TRIM$(a$(MENU(0))))
  74.   IF MENU(0)>=14 AND MENU(0)<=17
  75.     MENU 14+unit&,64+16+2
  76.     MENU MENU(0),256+64+16+2
  77.     unit&=MENU(0)-14
  78.     nom!=0
  79.     np$=TRIM$(c$)
  80.   ENDIF
  81.   '
  82.   IF c$="MAKE CHECKSUM"
  83.     @put_screen
  84.     @dochecksum
  85.     @afficher
  86.   ENDIF
  87.   '
  88.   IF c$="UNDO CHECKSUM"
  89.     @dochecksum
  90.     LPOKE buffer%+4,NOT LPEEK(buffer%+4)
  91.     @afficher
  92.   ENDIF
  93.   '
  94.   IF c$="LOAD BOOT"
  95.     @put_screen
  96.     erreur&=@readtrack(unit&,buffer%,0,1024)
  97.     IF erreur&
  98.       @scrolling_texte("SORRY ! IL DOIT Y AVOIR UNE ERREUR SUR LE DISK DU DRIVE DF"+STR$(unit&)+" !",0,31,0,-250)
  99.     ELSE
  100.       tampon!=TRUE
  101.       @afficher
  102.     ENDIF
  103.   ENDIF
  104.   '
  105.   IF c$="SAVE BOOT"
  106.     IF tampon!
  107.       @scrolling_rapide("VOULEZ-VOUS SAUVER LE BOOT SUR  DF"+STR$(unit&)+":  (Y/N) ?  ",31,0,0,630,258)
  108.       '
  109.       REPEAT
  110.         rep$=UPPER$(INKEY$)
  111.       UNTIL rep$="Y" OR rep$="N"
  112.       '
  113.       @scrolling_rapide("VOULEZ-VOUS SAUVER LE BOOT SUR  DF"+STR$(unit&)+":  (Y/N) ?  ",31,0,0,260,-150)
  114.       '
  115.       IF rep$="Y"
  116.         erreur&=@writetrack(unit&,buffer%,0,1024)
  117.         IF erreur&
  118.           @scrolling_texte("SORRY ! IL DOIT Y AVOIR UNE ERREUR SUR LE DISK DU DRIVE DF"+STR$(unit&)+" !",0,31,31,-250)
  119.         ENDIF
  120.       ENDIF
  121.       '
  122.     ELSE
  123.       @scrolling_texte("IL N'Y A PAS DE BOOT-BLOCK EN MEMOIRE !",31,31,0,-110)
  124.     ENDIF
  125.   ENDIF
  126.   '
  127.   IF c$="DUMP BOOT"
  128.     @afficher
  129.   ENDIF
  130.   '
  131.   IF c$="LOAD"
  132.     FILESELECT "CHARGEMENT D'UN FICHIER"," LOAD ",np$,n$
  133.     IF n$<>""
  134.       @put_screen
  135.       np$=n$
  136.       nom!=1
  137.       erreur&=FALSE
  138.       ON ERROR GOSUB errdisk
  139.       OPEN "i",#1,np$
  140.       IF NOT erreur&
  141.         IF LOF(#1)>1024
  142.           @scrolling_texte("LA TAILLE DU FICHIER EST > 1024 OCTETS ! ",31,31,15,-110)
  143.         ELSE
  144.           tampon!=TRUE
  145.           BGET #1,buffer%,LOF(#1)
  146.           @afficher
  147.         ENDIF
  148.         CLOSE #1
  149.       ENDIF
  150.     ENDIF
  151.   ENDIF
  152.   '
  153.   IF c$="SAVE" AND nom!
  154.     ON ERROR GOSUB errdisk
  155.     BSAVE np$,buffer%,1024
  156.   ENDIF
  157.   '
  158.   IF c$="SAVE AS ..." OR (c$="SAVE" AND nom!=0)
  159.     IF tampon!
  160.       FILESELECT "SAUVEGARDE D'UN FICHIER"," SAVE ",np$,n$
  161.       IF n$<>""
  162.         np$=n$
  163.         nom!=1
  164.         ON ERROR GOSUB errdisk
  165.         BSAVE np$,buffer%,1024
  166.       ENDIF
  167.     ELSE
  168.       @scrolling_texte("IL N'Y A PAS DE BOOT-BLOCK EN MEMOIRE ! ",31,0,31,-110)
  169.     ENDIF
  170.   ENDIF
  171.   '
  172.   IF c$="QUITTER"
  173.     @scrolling_rapide("VOULEZ-VOUS VRAIMENT QUITTER MEGA BOOT ? (Y/N) :",31,31,0,630,254)
  174.     '
  175.     REPEAT
  176.       rep$=UPPER$(INKEY$)
  177.     UNTIL rep$="Y" OR rep$="N"
  178.     '
  179.     @scrolling_rapide("VOULEZ-VOUS VRAIMENT QUITTER MEGA BOOT ? (Y/N) : ",31,31,0,250,-150)
  180.     '
  181.     IF rep$="Y"
  182.       exitflag!=1
  183.     ELSE
  184.       exitflag!=0
  185.     ENDIF
  186.   ENDIF
  187.   '
  188. RETURN
  189. '
  190. PROCEDURE errdisk
  191.   erreur&=TRUE
  192.   @scrolling_texte("SORRY ! IL DOIT Y AVOIR UNE ERREUR SUR LE DISK DU DRIVE DF"+STR$(unit&)+" ! ",10,31,10,-250)
  193.   RESUME NEXT
  194. RETURN
  195. '
  196. PROCEDURE fin
  197.   exitflag!=1
  198. RETURN
  199. '
  200. PROCEDURE afficher
  201.   @put_screen
  202.   s%=LPEEK(buffer%+4)
  203.   @dochecksum
  204.   sn%=LPEEK(buffer%+4)
  205.   LPOKE buffer%+4,s%
  206.   IF sn%=s%
  207.     COLOR 6
  208.     TEXT 164,243,"GOOD !"
  209.   ELSE
  210.     COLOR 6
  211.     TEXT 164,243,"BAD ! "
  212.   ENDIF
  213.   '
  214.   FOR a%=0 TO 15
  215.     l$=""
  216.     FOR b%=a%*64+buffer% TO a%*64+buffer%+63
  217.       c|=PEEK(b%)
  218.       IF c|<127 AND c|>31
  219.         l$=l$+CHR$(c|)
  220.       ELSE
  221.         l$=l$+"."
  222.       ENDIF
  223.     NEXT b%
  224.     GRAPHMODE 8
  225.     COLOR 0
  226.     TEXT 25,60+a%*8,"$"+HEX$(a%*64,4)+"    "+l$
  227.     COLOR 6
  228.     TEXT 28,58+a%*8,"$"+HEX$(a%*64,4)+"    "+l$
  229.     GRAPHMODE 1
  230.   NEXT a%
  231. RETURN
  232. '
  233. PROCEDURE dochecksum
  234.   LPOKE buffer%+4,0
  235.   r%(8)=buffer%
  236.   RCALL V:asm$,r%()
  237.   LPOKE buffer%+4,r%(0)
  238. RETURN
  239. '
  240. asm:
  241. DATA $323C,$00FF,$7000,$D098,$6400,$0004,$5240,$51C9,$FFF6,$4680,$4E75
  242. '
  243. PROCEDURE initasm
  244.   LOCAL a%,b%
  245.   DIM r%(31)
  246.   RESTORE asm
  247.   asm$=""
  248.   FOR a%=0 TO 10
  249.     READ b%
  250.     asm$=asm$+MKI$(b%)
  251.   NEXT a%
  252. RETURN
  253. '
  254. ' **********************************************************************
  255. ' *                                                                    *
  256. ' *              ROUTINES DE LECTURE/ECRITURE DES PISTES               *
  257. ' *                                                                    *
  258. ' **********************************************************************
  259. '
  260. FUNCTION readtrack(unit&,adr%,offset%,len%)
  261.   LOCAL e%,diskio$,readreply$,trackname$
  262.   diskio$=STRING$(20*4,0)
  263.   readreply$=STRING$(8*4,0)
  264.   trackname$="trackdisk.device"
  265.   '
  266.   LPOKE V:readreply$+16,FindTask(0)
  267.   e%=AddPort(V:readreply$)
  268.   '
  269.   IF e%>0
  270.     e%=OpenDevice(V:trackname$,unit&,V:diskio$,0)
  271.     IF e%=0
  272.       LPOKE V:diskio$+14,V:readreply$
  273.       DPOKE V:diskio$+28,2
  274.       LPOKE V:diskio$+40,adr%
  275.       LPOKE V:diskio$+36,len%
  276.       LPOKE V:diskio$+44,offset%
  277.       error&=DoIO(V:diskio$)
  278.       '
  279.       IF BYTE{V:diskio$+31}<>0 OR error&
  280.         error&=TRUE
  281.       ELSE
  282.         error&=FALSE
  283.       ENDIF
  284.       '
  285.       DPOKE V:diskio$+28,9
  286.       LPOKE V:diskio$+36,0
  287.       VOID DoIO(V:diskio$)
  288.       '
  289.       VOID CloseDevice(V:diskio$)
  290.     ELSE
  291.       error&=TRUE
  292.     ENDIF
  293.     VOID RemPort(V:readreply$)
  294.   ELSE
  295.     error&=TRUE
  296.   ENDIF
  297.   RETURN error&
  298. ENDFUNC
  299. '
  300. FUNCTION writetrack(unit&,adr%,offset%,len%)
  301.   LOCAL e%,diskio$,readreply$,trackname$
  302.   diskio$=STRING$(20*4,0)
  303.   readreply$=STRING$(8*4,0)
  304.   trackname$="trackdisk.device"
  305.   '
  306.   LPOKE V:readreply$+16,FindTask(0)
  307.   e%=AddPort(V:readreply$)
  308.   '
  309.   IF e%>0
  310.     e%=OpenDevice(V:trackname$,unit&,V:diskio$,0)
  311.     IF e%=0
  312.       LPOKE V:diskio$+14,V:readreply$
  313.       DPOKE V:diskio$+28,3
  314.       LPOKE V:diskio$+40,adr%
  315.       LPOKE V:diskio$+36,len%
  316.       LPOKE V:diskio$+44,offset%
  317.       error&=DoIO(V:diskio$)
  318.       '
  319.       IF BYTE{V:diskio$+31}<>0 OR error&
  320.         error&=TRUE
  321.       ELSE
  322.         error&=FALSE
  323.       ENDIF
  324.       '
  325.       DPOKE V:diskio$+28,4
  326.       VOID DoIO(V:diskio$)
  327.       '
  328.       DPOKE V:diskio$+28,9
  329.       LPOKE V:diskio$+36,0
  330.       VOID DoIO(V:diskio$)
  331.       '
  332.       VOID CloseDevice(V:diskio$)
  333.     ELSE
  334.       error&=TRUE
  335.     ENDIF
  336.     VOID RemPort(V:readreply$)
  337.   ELSE
  338.     error&=TRUE
  339.   ENDIF
  340.   RETURN error&
  341. ENDFUNC
  342. '
  343. > PROCEDURE picture
  344.   INLINE bp1%,20480
  345.   INLINE bp2%,20480
  346.   INLINE bp3%,20480
  347.   bp%(0)=bp1%
  348.   bp%(1)=bp2%
  349.   bp%(2)=bp3%
  350.   @color
  351.   FOR a|=0 TO 2
  352.     col$(a|)=SPACE$(20480)
  353.     BMOVE bp%(a|),V:col$(a|),20480
  354.   NEXT a|
  355.   SPUT col$()
  356.   ERASE col$()
  357. RETURN
  358. '
  359. > PROCEDURE color
  360.   INLINE col%,16
  361.   FOR v&=1 TO 8
  362.     c%(v&)={ADD(col%,ADD(v&,v&))}
  363.     SETCOLOR v&,c%(v&)
  364.   NEXT v&
  365.   FOR i=0 TO 1
  366.     FOR a|=1 TO 8
  367.       SETCOLOR a|,c%(a|)
  368.     NEXT a|
  369.     INSERT c%(1)=c%(8)
  370.   NEXT i
  371.   SETCOLOR 1,3,26,30
  372. RETURN
  373. '
  374. > PROCEDURE get_screen
  375.   SGET screen$()
  376. RETURN
  377. '
  378. > PROCEDURE put_screen
  379.   SPUT screen$()
  380. RETURN
  381. '
  382. > PROCEDURE scrolling_texte(texte$,tr,tv,tb,dep_x)
  383.   '
  384.   CLIP 254,234 TO 630,246
  385.   '
  386.   SETCOLOR 7,tr,tv,tb
  387.   COLOR 7
  388.   '
  389.   FOR t%=640 TO dep_x STEP -3
  390.     TEXT t%,243,texte$
  391.     VSYNC
  392.   NEXT t%
  393.   '
  394.   CLIP 0,0 TO 640,256
  395.   '
  396. RETURN
  397. '
  398. > PROCEDURE scrolling_rapide(texte$,tr,tv,tb,depart,dep_x)
  399.   '
  400.   CLIP 254,234 TO 630,246
  401.   '
  402.   SETCOLOR 7,tr,tv,tb
  403.   COLOR 7
  404.   '
  405.   FOR t%=depart TO dep_x STEP -10
  406.     TEXT t%,243,texte$
  407.     VSYNC
  408.   NEXT t%
  409.   '
  410.   CLIP 0,0 TO 640,256
  411.   '
  412. RETURN
  413.